/**
* Universidade de Brasilia
* 2013.1
* Trabalho de Programacao Orientada a Objetos
* Professor: Fernando Chacon
* Alunos
*   Lucas Lo Ami Alvino Silva - 09/0009886
*   Leonardo de Sousa Melo    - 08/34220
*
* @author Leonardo de Sousa Melo
*/

#ifndef ENTIDADES_H
#define ENTIDADES_H


#include "../include/TiposBasicos.h"

//!
//!Classe Administrador: Descreve os atributos e métodos da classe Administrador
//!

class Administrador
{
    private:
		//Matricula matricula;
		Senha senha;
	public:
		Administrador(){}
		Administrador(Senha);
        //Matricula getMatricula() const;
        //void setMatricula(const Matricula&);
        Senha getSenha() const;
        void setSenha(const Senha&);
};


//!
//!Classe Gerente: Descreve a os atributos e métodos da classe Gerente
//!


class Gerente
{
	private:
		Nome nome;
		Matricula matricula;
		Senha senha;
	public:
		Gerente(){}
		Gerente(Nome, Matricula, Senha);
        Nome getNome() const;
        void setNome(const Nome&);
        Matricula getMatricula() const;
        void setMatricula(const Matricula&);
        Senha getSenha() const;
        void setSenha(const Senha&);
};

//!
//!Classe Conta: Descreve os clientes que possuem uma conta no sistema.
//!
class Conta{
	private:
		Nome nome;
		Senha senha;
		NumeroConta numero_conta;
		TipoConta tipo_conta;
		Dinheiro limite_credito;
		Dinheiro saldo;
	public:
		Conta(){}
		Conta(Nome, Senha, NumeroConta, TipoConta, Dinheiro);
        Nome getNome() const;
        void setNome(const Nome&);
        Senha getSenha() const;
        void setSenha(const Senha&);
        NumeroConta getNumeroConta() const;
        void setNumeroConta(const NumeroConta&);
        TipoConta getTipoConta() const;
        void setTipoConta(const TipoConta&);
        Dinheiro getLimiteCredito() const;
        void setLimiteCredito(const Dinheiro&);
        Dinheiro getSaldo() const;
        void setSaldo(const Dinheiro&);
};

//!
//!Classe Pagamento: Descreve a transação de pagamentos nas contas.
//!
class Pagamento
{
	private:
		NumeroPagamento numero_pagamento;
		CodigoPagamento codigo_pagamento;
		Data data;
		NumeroConta numero_conta;
		Dinheiro valor;
	public:
		Pagamento(){}
		Pagamento(NumeroPagamento, CodigoPagamento, Data, NumeroConta);
        NumeroPagamento getNumeroPagamento() const;
        void setNumeroPagamento(const NumeroPagamento&);
        CodigoPagamento getCodigoPagamento() const;
        void setCodigoPagamento(const CodigoPagamento&);
        Data getData() const;
        void setData(const Data&);
        NumeroConta getNumeroConta() const;
        void setNumeroConta(const NumeroConta&);
        Dinheiro getValor() const;
        void setValor(const Dinheiro&);
};


//!
//!Definição dos métodos inline da classe Administrador
//!


/*inline Matricula Administrador::getMatricula() const {
    return matricula;
}*/

inline Senha Administrador::getSenha() const {
    return senha;
}

//!
//!Definição dos métodos inline da classe Gerente
//!

inline Nome Gerente::getNome() const {
    return nome;
}

inline Matricula Gerente::getMatricula() const {
    return matricula;
}

inline Senha Gerente::getSenha() const {
    return senha;
}

//!
//!Definição dos métodos inline da classe Conta
//!

inline Nome Conta::getNome() const {
    return nome;
}

inline Senha Conta::getSenha() const {
    return senha;
}

inline NumeroConta Conta::getNumeroConta() const {
    return numero_conta;
}

inline TipoConta Conta::getTipoConta() const {
    return tipo_conta;
}

inline Dinheiro Conta::getLimiteCredito() const {
    return limite_credito;
}

inline Dinheiro Conta::getSaldo() const {
    return saldo;
}

//!
//!Definição dos métodos inline da classe Pagamentos
//!

inline NumeroPagamento Pagamento::getNumeroPagamento() const {
    return numero_pagamento;
}

inline NumeroConta Pagamento::getNumeroConta() const {
    return numero_conta;
}

inline Data Pagamento::getData() const {
    return data;
}

inline CodigoPagamento Pagamento::getCodigoPagamento() const {
    return codigo_pagamento;
}

inline Dinheiro Pagamento::getValor() const {
    return valor;
}

#endif //!ENTIDADES_H
